<!DOCTYPE html>
<html lang="en">





<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/apple-touch-icon.png">
  <link rel="icon" type="image/png" href="/img/favicon.png">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#561f55">
  <meta name="description" content="">
  <meta name="author" content="Azerrroth">
  <meta name="keywords" content="">
  <title>FAT32 File System ~ Codeless</title>

  <link  rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.staticfile.org/github-markdown-css/4.0.0/github-markdown.min.css" />
  <link  rel="stylesheet" href="/lib/hint/hint.min.css" />

  
    <link  rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.0/styles/github-gist.min.css" />
  

  


<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_yg9cfy8wd6.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_pjno9b9zyxs.css">


<link  rel="stylesheet" href="/css/main.css" />

<!-- 自定义样式保持在最底部 -->


  <script  src="/js/utils.js" ></script>
<meta name="generator" content="Hexo 4.2.1"></head>


<body>
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/">&nbsp;<strong>Codeless</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/">
                <i class="iconfont icon-home-fill"></i>
                Home
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/">
                <i class="iconfont icon-archive-fill"></i>
                Archives
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/">
                <i class="iconfont icon-category-fill"></i>
                Categories
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/">
                <i class="iconfont icon-tags-fill"></i>
                Tags
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/">
                <i class="iconfont icon-user-fill"></i>
                About
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" data-toggle="modal" data-target="#modalSearch">&nbsp;&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="view intro-2" id="background" parallax=true
         style="background: url('/img/Background/earth.jpg') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="container text-center white-text fadeInUp">
            <span class="h2" id="subtitle">
              
            </span>

            
              
  <div class="mt-3 post-meta">
    <i class="iconfont icon-date-fill" aria-hidden="true"></i>
    <time datetime="2020-01-16 18:51">
      January 16, 2020 pm
    </time>
  </div>


<div class="mt-1">
  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-chart"></i>
      2.7k 字
    </span>
  

  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      29
       分钟
    </span>
  

  
  
    
      <!-- 不蒜子统计文章PV -->
      <span id="busuanzi_container_page_pv" style="display: none">
        <i class="iconfont icon-eye" aria-hidden="true"></i>
        <span id="busuanzi_value_page_pv"></span> 次
      </span>
    
  
</div>

            
          </div>

          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid">
  <div class="row">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-md">
      <div class="container nopadding-md" id="board-ctn">
        <div class="py-5" id="board">
          <div class="post-content mx-auto" id="post">
            
            <article class="markdown-body">
              <p>早期的文件系统是以FAT(File Allocate Table)文件分配表形式组织形成的，由于操作系统作业需要实现一个<strong>FAT32</strong>文件系统，所以这里简单介绍了解一下FAT文件系统的组织结构及具体实现。</p>
<a id="more"></a>
<h2 id="Pre-knowledge"><a href="#Pre-knowledge" class="headerlink" title="Pre-knowledge"></a>Pre-knowledge</h2><h3 id="MBR（Main-Boot-Record）"><a href="#MBR（Main-Boot-Record）" class="headerlink" title="MBR（Main Boot Record）"></a>MBR（Main Boot Record）</h3><p><strong>主引导</strong>记录，占446字节, 为计算机启动后从可启动介质上首先装入内存并且执行的代码，通常用来解释分区结构。</p>
<h3 id="DBR（DOS-Boot-Record）"><a href="#DBR（DOS-Boot-Record）" class="headerlink" title="DBR（DOS Boot Record）"></a>DBR（DOS Boot Record）</h3><p>DOS引导记录，为操作系统进入<strong>文件系统</strong>以后可以访问的第一个扇区，通常用来解释文件系统，DBR是由硬盘的MBR装载的程序段。DBR装入内存后，即开始执行该引导程序段，其主要功能是<strong>完成操作系统的自举并将控制权交给操作系统</strong>。每个分区都有引导扇区，但只有被设为活动分区才会被MBR装的DBR入内存运行。</p>
<h3 id="EBR（Extended-Boot-Record）"><a href="#EBR（Extended-Boot-Record）" class="headerlink" title="EBR（Extended Boot Record）"></a>EBR（Extended Boot Record）</h3><p>扩展分区引导记录，类似于主引导记录MBR.因为MBR四条分区信息的限制,可以使用EBR方便扩展.它的结构与MBR类似,但是没有引导程序和磁盘签名,仅仅保留了分区表和结束标志。</p>
<h1 id="FAT32-File-System"><a href="#FAT32-File-System" class="headerlink" title="FAT32 File System"></a>FAT32 File System</h1><h2 id="Introduction-to-FAT32"><a href="#Introduction-to-FAT32" class="headerlink" title="Introduction to FAT32"></a>Introduction to FAT32</h2><ul>
<li>FAT（File Allocation Table，文件分配表）文件系统是windows操作系统所使用的一种文件系统，它的发展过程经历了FAT12、FAT16、FAT32三个阶段。FAT文件系统用“簇”作为数据单元。一个“簇”由一组连续的扇区组成，簇所含的扇区数必须是2的整数次幂。簇的最大值为64个扇区，即32KB（一个扇区512Bytes）。所有簇从2开始进行编号，每个簇都有一个自己的地址编号。用户文件和目录都存储在簇中。</li>
<li>FAT文件系统的数据结构中有两个重要的结构：<strong>文件分配表</strong>和<strong>目录项</strong>：<ul>
<li>文件分配表：文件和文件夹内容储存在簇中，如果一个文件或文件夹需要多于一个簇的空间，则用FAT表来描述，如何找到另外的簇。FAT结构用于指出文件的下一个簇，同时也说明了簇的分配状态。FAT12、FAT16、FAT32这三种文件系统之间的主要区别在于<strong>FAT项的大小不同</strong>。</li>
<li>目录项：FAT文件系统的每一个文件和文件夹都被分配到一个目录项，目录项中记录着<strong>文件名、大小、文件内容</strong>起始地址以及其他一些元数据。</li>
</ul>
</li>
<li>在FAT文件系统中，文件系统的数据记录在“<strong>引导扇区中（DBR）</strong>”中。引导扇区位于整个文件系统的<strong>0号扇区</strong>，是文件系统隐藏区域（也称为保留区）的一部分，我们称其为<strong>DBR扇区</strong>，DBR中记录着文件系统的<strong>起始位置、大小、FAT表个数及大小等</strong>相关信息。在FAT文件系统中，同时使用“<strong>扇区地址</strong>”和“<strong>簇地址</strong>”两种地址管理方式。这是因为只有存储用户数据的数据区使用簇进行管理（FAT12和FAT16的根目录除外），所有簇都位于数据区。其他文件系统管理数据区域是不以簇进行管理的，这部分区域使用<strong>扇区地址</strong>进行管理。文件系统的起始扇区为0号扇区(逻辑0扇区)。<br><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1579171001263-6a9761c1-9f50-4cda-b5eb-dc79ad6ebd4c.png#align=left&amp;display=inline&amp;height=462&amp;originHeight=462&amp;originWidth=1476&amp;status=done&amp;style=none&amp;width=1476" srcset="/img/loading.gif" alt=""><h2 id="FAT32-file-structure"><a href="#FAT32-file-structure" class="headerlink" title="FAT32 file structure"></a>FAT32 file structure</h2></li>
<li>保留区：DOS引导扇区，FAT12、FAT16一般只有一个引导扇区，FAT32多一些。</li>
<li>FAT表：FAT区由两个大小相等的FAT文件分配表组成，FAT1、FAT2挨着</li>
<li>数据区：FAT32根目录通常位于2号簇。FAT12、FAT16的根目录虽然也属于数据区，但是他们并不由簇进行管理。也就是说FAT12、FAT16的根目录是没有簇号的，他们的2号簇从根目录之后开始。<h2 id="Reserved-Partition"><a href="#Reserved-Partition" class="headerlink" title="Reserved Partition"></a>Reserved Partition</h2>保留区由若干个扇区组成，保留区大小记录在DBR扇区中，常见为32、34、38个扇区。由DBR中0x0e和0x0f两个地址的数值决定，小端字节序，即N的值。<h2 id="DBR"><a href="#DBR" class="headerlink" title="DBR"></a>DBR</h2><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1579171001724-dfafaab0-7b12-4343-b29f-2918ccb37002.png#align=left&amp;display=inline&amp;height=649&amp;originHeight=842&amp;originWidth=956&amp;status=done&amp;style=none&amp;width=737" srcset="/img/loading.gif" alt=""> </li>
<li>0x00~0x02：3字节，跳转指令。</li>
<li>0x03~0x0A：8字节，文件系统标志和版本号，这里为MSDOS5.0。</li>
<li>0x0B~0x0C：2字节，<strong>每扇区字节数</strong>，0x0200=512</li>
<li>0x0D~0x0D：1字节，<strong>每簇扇区数</strong>，0x08</li>
<li>0x0E~0x0F：2字节，<strong>保留扇区数</strong>，0x0C22=3106</li>
<li>0x10~0x10：1字节，<strong>FAT表个数</strong>，0x02</li>
<li>0x11~0x12：2字节，FAT32必须等于0，FAT12/FAT16为根目录中目录的个数</li>
<li>0x13~0x14：2字节，FAT32必须等于0，FAT12/FAT16为扇区总数。</li>
<li>0x15~0x15：1字节，哪种存储介质，0xF8标准值，可移动存储介质。</li>
<li>0x16~0x17：2字节，FAT32必须为0，FAT12/FAT16为一个FAT 表所占的扇区数。</li>
<li>0x18~0x19：2字节，每磁道扇区数，只对于“特殊形状”（由磁头和柱面分割为若干磁道）的存储介质有效，0x003F=63。</li>
<li>0x1A~0x1B：2字节，磁头数，只对特殊的介质才有效，0x00FF=255。</li>
<li>0x1C~0x1F：4字节，EBR分区之前所隐藏的扇区数，0x0004A800=305152又出现了呢，与MBR中地址0x1C6开始的4个字节数值相等。</li>
<li>0x20~0x23：4字节，<strong>文件系统总扇区数</strong>，0x00E83800=15218688</li>
<li>0x24~0x27：4字节，<strong>每个FAT表占用扇区数</strong>，0x000039EF=14831</li>
<li>0x28~0x29：2字节，标记，此域FAT32 特有。</li>
<li>0x2A~0x2B：2字节，FAT32版本号0.0，FAT32特有。</li>
<li>0x2C~0x2F：4字节，<strong>根目录所在第一个簇的簇</strong>号，0x02。（虽然在FAT32文件系统下，根目录可以存放在数据区的任何位置，但是通常情况下还是起始于2号簇）</li>
<li>0x30~0x31：2字节，FSINFO（文件系统信息扇区）扇区号0x01，该扇区为操作系统提供关于空簇总数及下一可用簇的信息。</li>
<li>0x32~0x33：2字节，备份引导扇区的位置。备份引导扇区总是位于文件系统的6号扇区。</li>
<li>0x34~0x3F：12字节，用于以后FAT 扩展使用。</li>
<li>0x40~0x40：1字节，与FAT12/16 的定义相同，只不过两者位于启动扇区不同的位置而已。</li>
<li>0x41~0x41：1字节，与FAT12/16 的定义相同，只不过两者位于启动扇区不同的位置而已 。</li>
<li>0x42~0x42：1字节，扩展引导标志，0x29。与FAT12/16 的定义相同，只不过两者位于启动扇区不同的位置而已</li>
<li>0x43~0x46：4字节，卷序列号。通常为一个随机值。</li>
<li>0x47~0x51：11字节，卷标（ASCII码），如果建立文件系统的时候指定了卷标，会保存在此。</li>
<li>0x52~0x59：8字节，文件系统格式的ASCII码，FAT32。</li>
<li>0x5A~0x1FD：共410字节，引导代码。</li>
<li>0x1FE~0x1FF：签名标志“55 AA”。<br>FAT文件系统将引导代码与文件形同数据结构融合在FAT32文件系统引导扇区的512字节中，90~509字节为引导代码，而FAT12/16则是62~509字节为引导代码。同时，FAT32还可以利用引导扇区后的扇区空间存放附加的引导代码。一个FAT卷即使不是可引导文件系统，也会存在引导代码。<h2 id="FSINFO扇区"><a href="#FSINFO扇区" class="headerlink" title="FSINFO扇区"></a>FSINFO扇区</h2>FAT32在保留区中增加了一个FSINFO扇区，用以记录文件系统中空闲簇的数量以及下一可用簇的簇号等信息，以供操作系统作为参考。FSINFO信息扇区一般位于文件系统的1号扇区，结构非常简单。<br><img src="https://cdn.nlark.com/yuque/0/2020/png/431085/1579171002162-e0a9a671-57ee-4325-bc97-d692c0f7230e.png#align=left&amp;display=inline&amp;height=598&amp;originHeight=840&amp;originWidth=954&amp;status=done&amp;style=none&amp;width=679" srcset="/img/loading.gif" alt=""> </li>
<li>0x200~0x203：4个字节，扩展引导标志“0x52526141”。</li>
<li>0x204~0x3E3：480个字节，未使用，全部置0。</li>
<li>0x3E4~0x3E7：4个字节，FSINFO签名“0x72724161”。</li>
<li>0x3E8~0x3EB：4个字节，文件系统的空簇数，0xFFFFFFFF,这个值感觉有问题，格式化SD卡新建一个小于4K的文件，此处的值变成0x1CF6FE，所以上面的值应该为0x1FF6FF，猜测可能是由于格式化之后就会将此处置FF，新建文件后才会恢复</li>
<li>0x3EC~0x3EF：4个字节，下一可用簇号（0x00000002）。</li>
<li>0x3F0~0x3FD：14个字节，未使用。</li>
<li>0x3FE~0x3FF：2个字节，“55 AA”标志。</li>
<li>温馨提示：通常情况下，文件系统的2号扇区结尾也会被设置“55 AA”标志。6号扇区也会有一个引导扇区的备份，相应的7号扇区应该是一个备份FSINFO信息扇区，8号扇区可以看做是2号扇区的备份。</li>
</ul>
<h2 id="FAT表"><a href="#FAT表" class="headerlink" title="FAT表"></a>FAT表</h2><p>保留分区后面的是FAT区，由两个完全相同的FAT（File Allocation Table，分区表）构成。FAT表是一组与数据簇号对应的列表。FAT2紧跟在FAT1之后，可以由 FAT表扇区数+FAT1 计算出来。</p>
<h2 id="FAT表作用"><a href="#FAT表作用" class="headerlink" title="FAT表作用"></a>FAT表作用</h2><ul>
<li>文件系统分配磁盘空间按簇来分配。因此，文件占有磁盘空间时，基本单位不是字节而是<strong>簇</strong>，即使某个文件只有一个字节，操作系统也会给它分配一个<strong>最小单元</strong>：即一个<strong>簇</strong>。对于大文件，需要分配多个簇。同一个文件的数据并不一定完整地存放在磁盘中一个连续地区域内，而往往会分若干段，像链子一样存放。这种存储方式称为文件的链式存储。为了实现文件的链式存储，文件系统必须准确地记录哪些簇已经被文件占用，还必须为每个已经占用的簇指明存储后继的下一个簇的簇号，对于文件的最后一簇，则要指明本簇无后继簇。这些都是由FAT表来保存的，FAT 表对应表项中记录着它所代表的簇的有关信息：诸如是空，是不是坏簇，是否是已经是某个文件的尾簇等。</li>
<li>对于文件系统来说，FAT表有两个重要作用：<strong>描述簇的分配状态</strong>以及<strong>标明文件或目录的下一簇的簇号</strong>。</li>
<li>通常情况下，一个FAT文件系统会有两个FAT表，但有时也允许只有一个FAT表，FAT表的具体个数记录在引导扇区的偏移0x10字节处。</li>
<li>由于FAT区紧跟在文件系统保留区后，所以FAT1在文件系统中的位置可以通过引导记录中偏移0x0E~0x0F字节处的“<strong>保留扇区数</strong>”得到，即M值。<h2 id="FAT表分析"><a href="#FAT表分析" class="headerlink" title="FAT表分析"></a>FAT表分析</h2>FAT32中每个簇地址都有$32bit$，则FAT表中所有地址位置以4字节（Bytes）为单位进行划分，并且对划分后位置为0的地址进行编号，0号地址与1号地址系统保留，从2号地址开始，每个地址对应于数据区的簇号。</li>
</ul>

            </article>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-Operating-System/">操作系统(Operating System)</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/tags/Operating-System/">Operating System</a>
                    
                      <a class="hover-with-bg" href="/tags/File-System/">File System</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">本博客所有文章除特别声明外，均采用 <a href="https://zh.wikipedia.org/wiki/Wikipedia:CC_BY-SA_3.0%E5%8D%8F%E8%AE%AE%E6%96%87%E6%9C%AC" target="_blank" rel="nofollow noopener noopener">CC BY-SA 3.0协议</a> 。转载请注明出处！</p>
              
              
                <div class="post-prevnext row">
                  <div class="post-prev col-6">
                    
                    
                      <a href="/2020/01/16/OS-Chapter-1-Introduction/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">OS Chapter 1 Introduction</span>
                        <span class="visible-mobile">Previous</span>
                      </a>
                    
                  </div>
                  <div class="post-next col-6">
                    
                    
                      <a href="/2020/01/16/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AE%80%E7%AD%94%E9%A2%98%E7%9B%AE/">
                        <span class="hidden-mobile">操作系统简答题目</span>
                        <span class="visible-mobile">Next</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </div>
                </div>
              
            </div>

            
              <!-- Comments -->
              <div class="comments" id="comments">
                
                
  <script type="text/javascript">
    function loadUtterances() {
      var s = document.createElement('script');
      s.setAttribute('src', 'https://utteranc.es/client.js');
      s.defer = false
      s.setAttribute('repo', 'Azerrroth/comments-utterances');
      s.setAttribute('issue-term', 'pathname');
      
      s.setAttribute('theme', 'github-light');
      s.setAttribute('crossorigin', 'anonymous');
      var e = document.getElementsByTagName('script')[0];
      e.parentNode.insertBefore(s, e);
    }
    createObserver(loadUtterances, 'comments')
  </script>


              </div>
            
          </div>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;TOC</p>
  <div id="tocbot"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->


    
  </main>

  
    <a id="scroll-top-button" href="#" role="button">
      <i class="iconfont icon-arrowup" aria-hidden="true"></i>
    </a>
  

  
    <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">Search</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">keyword</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
  

  

  

  <footer class="mt-5">
  <div class="text-center py-3">
    <div>
      <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a>
      <i class="iconfont icon-love"></i>
      <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener">
        <span>Fluid</span></a>
    </div>
    
  <div class="statistics">
    
    

    
      
        <!-- 不蒜子统计PV -->
        <span id="busuanzi_container_site_pv" style="display: none">
            总访问量 
            <span id="busuanzi_value_site_pv"></span>
             次
          </span>
      
      
        <!-- 不蒜子统计UV -->
        <span id="busuanzi_container_site_uv" style="display: none">
            总访客数 
            <span id="busuanzi_value_site_uv"></span>
             人
          </span>
      
    
  </div>


    

    
  </div>
</footer>

<!-- SCRIPTS -->
<script  src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js" ></script>
<script  src="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/js/bootstrap.min.js" ></script>
<script  src="/js/debouncer.js" ></script>
<script  src="/js/main.js" ></script>

<!-- Plugins -->


  
    <script  src="/js/lazyload.js" ></script>
  



  <script defer src="https://cdn.staticfile.org/clipboard.js/2.0.6/clipboard.min.js" ></script>
  <script  src="/js/clipboard-use.js" ></script>



  <script defer src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" ></script>





  <script  src="https://cdn.staticfile.org/tocbot/4.11.1/tocbot.min.js" ></script>
  <script>
    $(document).ready(function () {
      var boardCtn = $('#board-ctn');
      var boardTop = boardCtn.offset().top;

      tocbot.init({
        tocSelector: '#tocbot',
        contentSelector: 'article.markdown-body',
        headingSelector: 'h1,h2,h3,h4,h5,h6',
        linkClass: 'tocbot-link',
        activeLinkClass: 'tocbot-active-link',
        listClass: 'tocbot-list',
        isCollapsedClass: 'tocbot-is-collapsed',
        collapsibleClass: 'tocbot-is-collapsible',
        collapseDepth: 0,
        scrollSmooth: true,
        headingsOffset: -boardTop
      });
      if ($('.toc-list-item').length > 0) {
        $('#toc').css('visibility', 'visible');
      }
    });
  </script>



  <script  src="https://cdn.staticfile.org/typed.js/2.0.11/typed.min.js" ></script>
  <script>
    var typed = new Typed('#subtitle', {
      strings: [
        '  ',
        "FAT32 File System&nbsp;",
      ],
      cursorChar: "_",
      typeSpeed: 70,
      loop: false,
    });
    typed.stop();
    $(document).ready(function () {
      $(".typed-cursor").addClass("h2");
      typed.start();
    });
  </script>



  <script  src="https://cdn.staticfile.org/anchor-js/4.2.2/anchor.min.js" ></script>
  <script>
    anchors.options = {
      placement: "right",
      visible: "false",
      
    };
    var el = "h1,h2,h3,h4,h5,h6".split(",");
    var res = [];
    for (item of el) {
      res.push(".markdown-body > " + item)
    }
    anchors.add(res.join(", "))
  </script>



  <script  src="/js/local-search.js" ></script>
  <script>
    var path = "/local-search.xml";
    var inputArea = document.querySelector("#local-search-input");
    inputArea.onclick = function () {
      searchFunc(path, 'local-search-input', 'local-search-result');
      this.onclick = null
    }
  </script>



  <script  src="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.css" />

  <script>
    $('#post img:not(.no-zoom img, img[no-zoom]), img[zoom]').each(
      function () {
        var element = document.createElement('a');
        $(element).attr('data-fancybox', 'images');
        $(element).attr('href', $(this).attr('src'));
        $(this).wrap(element);
      }
    );
  </script>





  

  
    <!-- MathJax -->
    <script>
      MathJax = {
        tex: {
          inlineMath: [['$', '$'], ['\\(', '\\)']]
        },
        options: {
          renderActions: {
            findScript: [10, doc => {
              document.querySelectorAll('script[type^="math/tex"]').forEach(node => {
                const display = !!node.type.match(/; *mode=display/);
                const math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display);
                const text = document.createTextNode('');
                node.parentNode.replaceChild(text, node);
                math.start = { node: text, delim: '', n: 0 };
                math.end = { node: text, delim: '', n: 0 };
                doc.math.push(math);
              });
            }, '', false],
            insertedScript: [200, () => {
              document.querySelectorAll('mjx-container').forEach(node => {
                let target = node.parentNode;
                if (target.nodeName.toLowerCase() === 'li') {
                  target.parentNode.classList.add('has-jax');
                }
              });
            }, '', false]
          }
        }
      };
    </script>

    <script async src="https://cdn.staticfile.org/mathjax/3.0.5/es5/tex-svg.js" ></script>

  













  

  

  

  

  

  





</body>
</html>
